package utils

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/zeromicro/go-zero/core/conf"
	"gozero-demo/internal/config"
	"gozero-demo/internal/svc"
	"log"
	"os"
	"path/filepath"
)

type TestCtx struct {
	Ctx    context.Context
	SvcCtx *svc.ServiceContext
}

func NewTestCtx() *TestCtx {
	rootPath, err := GetProjectRootPath()
	if err != nil {
		log.Fatalf("获取项目根目录失败: %s", err)
	}

	var c config.Config
	configFile := config.GetConfigFile(fmt.Sprintf("%v/gozero", rootPath))
	//fmt.Println("configFile", configFile)
	conf.MustLoad(configFile, &c)
	svcCtx := svc.NewServiceContext(c)
	ctx := context.Background()
	return &TestCtx{
		Ctx:    ctx,
		SvcCtx: svcCtx,
	}
}

// getProjectRoot 获取项目根目录路径
func GetProjectRootPath() (string, error) {
	// 获取当前工作目录
	wd, err := os.Getwd()
	if err != nil {
		return "", err
	}

	// 从当前目录向上查找 go.mod 文件
	for {
		// 检查当前目录是否存在 go.mod 文件
		if _, err := os.Stat(filepath.Join(wd, "go.mod")); err == nil {
			return wd, nil
		}

		// 获取父目录
		parent := filepath.Dir(wd)
		if parent == wd {
			return "", fmt.Errorf("未找到项目根目录")
		}
		wd = parent
	}
}

func EchoJson(data interface{}) string {
	// 将 list 编码为格式化的 JSON
	jsonData, err := json.MarshalIndent(data, "", "    ")
	if err != nil {
		log.Fatalf("编码 JSON 失败: %s", err)
	}
	return string(jsonData)
}
